# -*- coding: utf-8 -*- p103
import numpy as np
from sklearn import tree
import graphviz
'''
sklearn.tree：从scikit-learn库导入决策树相关的功能。
numpy：用于处理数组和矩阵的库。
graphviz：用于将决策树模型转化为图形表示的库。
'''
# 处理数据
filename = 'Wine.csv'
labelname = './label_wine.csv'
data = np.loadtxt(open(filename, "rb"), delimiter=",", skiprows=0)    # 用于从文本文件加载数据并将其作为 NumPy 数组返回。
label = np.loadtxt(open(labelname, "rb"), dtype=int, delimiter=",", skiprows=0)

# 训练模型
clf = tree.DecisionTreeClassifier(criterion='gini')
clf.fit(data, label)
'''
tree.export_graphviz 函数来将决策树 tree_estimator 导出为 Graphviz 的 DOT 格式。
Graphviz 是一个开源的图可视化软件，它可以将 DOT 格式的文本文件渲染为图形。
out_file=None：
这个参数指定了 DOT 数据的输出文件。如果设置为 None，则 DOT 数据将作为字符串返回，而不是写入文件。在你的代码中，这个字符串被赋值给了 dot_data 变量。
filled=True：
当设置为 True 时，这个选项会使节点在渲染时根据其纯度（例如，在分类问题中，节点中大多数样本所属的类别）进行着色。
纯度较高的节点（即更偏向某一类别的节点）通常会被赋予更深的颜色。
rounded=True：
这个选项控制节点的形状。当设置为 True 时，节点将以圆角矩形的形式显示。如果设置为 False，则节点将以普通矩形的形式显示。
special_characters=True：
这个选项控制是否使用特殊字符来显示非 ASCII 字符和空格。在某些情况下，如果你的特征名或类别名包含特殊字符或空格，
设置这个选项为 True 可以确保它们正确地在渲染的图形中显示。
'''
dot_data = tree.export_graphviz(clf, out_file=None,
                         filled=True, rounded=True,
                         special_characters=True)
graph = graphviz.Source(dot_data)        # 使用Graphviz的Source类来渲染dot数据
graph.render('Wine4-1-11.dot', "img/", view=True)    # 将dot数据渲染为PDF或PNG文件， 注意：view=False意味着不会自动打开渲染的文件，需要手动查看